#ifndef PL_BT_TYPES_H
#define PL_BT_TYPES_H

#include "lua.hpp"
#include "../core/ObjectFactory.h"

class luabind_btvec : public DataTypeBase
{
public:
static int li_plusEquals_vec(lua_State* L);
static int li_minusEquals_vec(lua_State* L);
static int li_plus_vec(lua_State* L);
static int li_minus_vec(lua_State* L);
static int li_timesEquals_vec(lua_State* L);
static int li_times_vec(lua_State* L);
static int li_dotprod_vec(lua_State* L);
static int li_norm_inplace_vec(lua_State* L);
static int li_normalized_vec(lua_State* L);
static int li_distance2_vec(lua_State* L);
static int li_distance_vec(lua_State* L);
static int li_cross_vec(lua_State* L);
static int li_rotate_axisangle_vec(lua_State* L);
static int li_anglebetween_vec(lua_State* L);
static int li_get_vec(lua_State* L);
static int li_set_vec(lua_State* L);
static int li_totable_vec(lua_State* L);

static void pushStaticFuncs(lua_State* L);
void registerFunctions(lua_State* L);
};

class luabind_btquat : public DataTypeBase
{
public:
static int li_setRotation_axisangle_quat(lua_State* L);
static int li_setRotation_euler_quat(lua_State* L);
static int li_setRotationZYX_euler_quat(lua_State* L);
static int li_timesEquals_quat(lua_State* L);
static int li_times_quat(lua_State* L);
static int li_norm_inplace_quat(lua_State* L);
static int li_normalized_quat(lua_State* L);
static int li_getAngle_quat(lua_State* L);
static int li_getAxis_quat(lua_State* L);
static int li_get_quat(lua_State* L);
static int li_set_quat(lua_State* L);
static int li_inverse_quat(lua_State* L);
static int li_slerp_quat(lua_State* L);
static int li_rotatevec_quat(lua_State* L);
static int li_fromVecBasis_quat(lua_State* L);
static int li_fromVecBasisCol_quat(lua_State* L);
static int li_toVecBasis_quat(lua_State* L);
static int li_totablexyzw_quat(lua_State* L);
static int li_totablewxyz_quat(lua_State* L);

static void pushStaticFuncs(lua_State* L);
void registerFunctions(lua_State* L);
};

class luabind_bttrans : public DataTypeBase
{
public:
static int li_setRotation_trans(lua_State* L);
static int li_setOrigin_trans(lua_State* L);
static int li_getRotation_trans(lua_State* L);
static int li_getOrigin_trans(lua_State* L);
static int li_timesEquals_trans(lua_State* L);
static int li_times_trans(lua_State* L);
static int li_inverse_trans(lua_State* L);
static int li_inverseTimes_trans(lua_State* L);
static int li_applyTo_trans(lua_State* L);
static int li_fromMatrix_trans(lua_State* L);
static int li_toMatrix_trans(lua_State* L);

static void pushStaticFuncs(lua_State* L);
void registerFunctions(lua_State* L);
};

#endif